隨著人工智能的熱度上升,圖像識(shí)別這一分領(lǐng)域也漸漸被人們所關(guān)注。圖像識(shí)別中更貼近我們生活的可能就是 OCR 技術(shù)了。可能很多同學(xué)還不知道什么是 OCR。我們先來看下 OCR 的定義:OCR (Optical Character Recognition,光學(xué)字符識(shí)別)是指電子設(shè)備(例如掃描儀或數(shù)碼相機(jī))檢查紙上打印的字符,通過檢測(cè)暗、亮的模式確定其形狀,然后用字符識(shí)別方法將形狀翻譯成計(jì)算機(jī)文字的過程。
今天就來簡(jiǎn)單分析下 OCR 技術(shù)的原理,不會(huì)涉及具體的算法講解和推導(dǎo),畢竟每一個(gè)算法都能占很長的篇幅,每一個(gè)算法都能重新開一篇來寫。
從整體上來說,OCR一般分為兩個(gè)大步驟:圖像處理以及文字識(shí)別。
識(shí)別文字前,我們要對(duì)原始圖片進(jìn)行預(yù)處理,以便后續(xù)的特征提取和學(xué)習(xí)。這個(gè)過程通常包含:灰度化、二值化、降噪、傾斜矯正、文字切分等子步驟。每一個(gè)步驟都涉及了不同的算法。我們以下面這張?jiān)紙D片為例,進(jìn)行每個(gè)步驟的講解。
灰度化(gray processing),在RGB模型中,如果R=G=B時(shí),則彩色表示一種灰度顏色,其中R=G=B的值叫灰度值,因此,灰度圖像每個(gè)像素只需一個(gè)字節(jié)存放灰度值(又稱強(qiáng)度值、亮度值),灰度范圍為0-255。說通俗一點(diǎn),就是將一張彩色圖片變?yōu)楹诎讏D片。
灰度化
灰度化一般有分量法、最大值法、平均值法、加權(quán)平均法四種方法對(duì)彩色圖像進(jìn)行灰度化。
一幅圖像包括目標(biāo)物體、背景還有噪聲,要想從多值的數(shù)字圖像中直接提取出目標(biāo)物體,常用的方法就是設(shè)定一個(gè)閾值T,用T將圖像的數(shù)據(jù)分成兩部分:大于T的像素群和小于T的像素群。這是研究灰度變換的較特殊的方法,稱為圖像的二值化(binaryzation)。
二值化的黑白圖片不包含灰色,只有純白和純黑兩種顏色。
二值化
二值化里重要的就是閾值的選取,一般分為固定閾值和自適應(yīng)閾值。 比較常用的二值化方法則有:雙峰法、P參數(shù)法、迭代法和OTSU法等。
現(xiàn)實(shí)中的數(shù)字圖像在數(shù)字化和傳輸過程中常受到成像設(shè)備與外部環(huán)境噪聲干擾等影響,稱為含噪圖像或噪聲圖像。減少數(shù)字圖像中噪聲的過程稱為圖像降噪(Image Denoising)。
圖像中噪聲的來源有許多種,這些噪聲來源于圖像采集、傳輸、壓縮等各個(gè)方面。噪聲的種類也各不相同,比如椒鹽噪聲,高斯噪聲等,針對(duì)不同的噪聲有不同的處理算法。
在上一步得到的圖像中可以看到很多零星的小黑點(diǎn),這就是圖像中的噪聲,會(huì)嚴(yán)重干擾到我們程序?qū)τ趫D片的切割和識(shí)別,因此我們需要降噪處理。降噪在這個(gè)階段非常重要,降噪算法的好壞對(duì)特征提取的影響很大。
圖像降噪
圖像降噪的方法一般有均值濾波器、自適應(yīng)維納濾波器、中值濾波器、形態(tài)學(xué)噪聲濾除器、小波去噪等。
對(duì)于用戶而言,拍照的時(shí)候不可能絕對(duì)的水平,所以,我們需要通過程序?qū)D像做旋轉(zhuǎn)處理,來找一個(gè)認(rèn)為可能水平的位置,這樣切出來的圖,才有可能是較好的一個(gè)效果。
傾斜矯正常用的方法是霍夫變換,其原理是將圖片進(jìn)行膨脹處理,將斷續(xù)的文字連成一條直線,便于直線檢測(cè)。計(jì)算出直線的角度后就可以利用旋轉(zhuǎn)算法,將傾斜圖片矯正到水平位置。
對(duì)于一段多行文本來講,文字切分包含了行切分與字符切分兩個(gè)步驟,傾斜矯正是文字切分的前提。我們將傾斜矯正后的文字投影到 Y軸,并將所有值累加,這樣就能得到一個(gè)在y軸上的直方圖。
圖片在Y軸的投影直方圖
直方圖的谷底就是背景,峰值則是前景(文字)所在的區(qū)域。于是我們就將每行文字的位置給識(shí)別出來了。
行切分
字符切分和行切分類似,只是這次我們要將每行文字投影到 X軸。
但要注意的是,同一行的兩個(gè)字符往往挨的比較緊,有些時(shí)候會(huì)出現(xiàn)垂直方向上的重疊,投影的時(shí)候?qū)⑺麄冋J(rèn)為是一個(gè)字符,從而造成切割的時(shí)候出錯(cuò)(多出現(xiàn)在英文字符);也有些時(shí)候同一個(gè)字符的左右結(jié)構(gòu)在X軸的投影存在一個(gè)小間隙,切割的時(shí)候誤把一個(gè)字符切分為兩個(gè)字符(多出現(xiàn)在中文字符)。所以相較于行切分,字符切分更難。
對(duì)于這種情況,我們可以預(yù)先設(shè)定一個(gè)字符寬度的期望值,切出的字符如果投影超出期望值太大,則認(rèn)為是兩個(gè)字符;如果遠(yuǎn)遠(yuǎn)小于這個(gè)期望值,則忽略這個(gè)間隙,把間隙左右的“字符”合成一個(gè)字符來識(shí)別。
字符切分
預(yù)處理完畢后,就到了文字識(shí)別的階段。這個(gè)階段會(huì)涉及一些人工智能方面的知識(shí),比較抽象,沒法用圖片表達(dá),我盡量講得簡(jiǎn)單易懂一些。
特征是用來識(shí)別文字的關(guān)鍵信息,每個(gè)不同的文字都能通過特征來和其他文字進(jìn)行區(qū)分。對(duì)于數(shù)字和英文字母來說,這個(gè)特征提取是比較容易的,總共就 10 + 26 x 2 = 52 個(gè)字符,而且都是小字符集。對(duì)于漢字來說,特征提取的難度就比較大了,因?yàn)槭紫葷h字是大字符集;其次國標(biāo)中光是常用的第一級(jí)漢字就有3755個(gè);最后漢字結(jié)構(gòu)復(fù)雜,形近字多,特征維度就比較大。
在確定了使用何種特征后,還有可能要進(jìn)行特征降維,這種情況下,如果特征的維數(shù)太高,分類器的效率會(huì)受到很大的影響,為了提高識(shí)別速率,往往就要進(jìn)行降維,這個(gè)過程也很重要,既要降低特征維數(shù),又得使得減少維數(shù)后的特征向量還保留了足夠的信息量(以區(qū)分不同的文字)。
對(duì)一個(gè)文字圖像,提取出特征,丟給分類器,分類器就對(duì)其進(jìn)行分類,告訴你這個(gè)特征該識(shí)別成哪個(gè)文字。分類器的設(shè)計(jì)就是我們的任務(wù)。分類器的設(shè)計(jì)方法一般有:模板匹配法、判別函數(shù)法、神經(jīng)網(wǎng)絡(luò)分類法、基于規(guī)則推理法等,這里不展開敘述。在進(jìn)行實(shí)際識(shí)別前,往往還要對(duì)分類器進(jìn)行訓(xùn)練,這是一個(gè)監(jiān)督學(xué)習(xí)的過程。成熟的分類器也有很多,有 SVM,CNN 等。
其實(shí)就是對(duì)于分類器的分類結(jié)果進(jìn)行優(yōu)化,這一般就要涉及自然語言理解的范疇了。
首先是形近字的處理:舉個(gè)栗子,“分”和“兮”形近,但是如果遇到“分?jǐn)?shù)”這個(gè)詞語,就不應(yīng)該識(shí)別為“兮數(shù)”,因?yàn)?/span>“分?jǐn)?shù)”才是一個(gè)正常詞語。這需要通過語言模型來進(jìn)行糾正。
其次是對(duì)于文字排版的處理:比如一些書籍是分左右兩欄的,同一行的左右兩欄不屬于同一句話,不存在任何語法上的聯(lián)系。如果按照行切割,就會(huì)把左行的末尾和右行的開頭連在一起,這是我們不希望看到的,這樣的情況需要進(jìn)行特殊處理。
OCR 的大致原理就是這樣。整體上來看,OCR 的步驟繁多,涉及的算法復(fù)雜,針對(duì)每一個(gè)步驟,每一個(gè)算法都有許多單獨(dú)的研究論文,本文無法進(jìn)行深入探討。如果從零開始做 OCR,這將是一個(gè)浩大的工程。筆者才疏學(xué)淺,對(duì)于模式識(shí)別、機(jī)器學(xué)習(xí)也屬于入門階段,如果有錯(cuò)漏的地方,還請(qǐng)各位斧正。
文章轉(zhuǎn)自網(wǎng)絡(luò),如有侵權(quán)請(qǐng)聯(lián)系刪除